# -*- coding: utf-8 -*-
# filename: receive.py
import xml.etree.ElementTree as ET

def parse_xml(web_data):
    if len(web_data) == 0:
        return None
    xmlData = ET.fromstring(web_data)
    msg_factory = {
        "text": TextMsg,
        "image": ImageMsg,
        "voice": VoiceMsg,
        "video": VideoMsg,
        "shortvideo": ShortVideoMsg,
        "location": LocationMsg,
        "link": LinkMsg
    }
    event_factory = {
        "subscribe": SubscribeEvent,
        "unsubscribe": SubscribeEvent,
        "SCAN": ScanEvent,
        "LOCATION": LocationEvent,
        "CLICK": MenuEvent,
        "VIEW": MenuEvent,
    }
    msg_type = xmlData.find('MsgType').text
    if msg_type in msg_factory:
        return msg_factory[msg_type](xmlData)
    elif msg_type == 'event':
        msg_event = xmlData.find('Event').text
        if msg_event in event_factory:
            return event_factory[msg_event](xmlData)
    return Msg(xmlData)

class Msg(object):
    def __init__(self, xmlData):
        self.ToUserName = xmlData.find('ToUserName').text
        self.FromUserName = xmlData.find('FromUserName').text
        self.CreateTime = xmlData.find('CreateTime').text
        self.MsgType = xmlData.find('MsgType').text

class TextMsg(Msg):
    def __init__(self, xmlData):
        Msg.__init__(self, xmlData)
        self.Content = xmlData.find('Content').text.encode("utf-8")
        self.MsgId = xmlData.find('MsgId').text

class ImageMsg(Msg):
    def __init__(self, xmlData):
        Msg.__init__(self, xmlData)
        self.PicUrl = xmlData.find('PicUrl').text
        self.MediaId = xmlData.find('MediaId').text
        self.MsgId = xmlData.find('MsgId').text

class VoiceMsg(Msg):
    def __init__(self, xmlData):
        Msg.__init__(self, xmlData)
        self.MediaId = xmlData.find('MediaId').text
        self.Format= xmlData.find('Format').text
        self.Recognition = xmlData.find('Recognition').text
        self.MsgId = xmlData.find('MsgId').text

class VideoMsg(Msg):
    def __init__(self, xmlData):
        Msg.__init__(self, xmlData)
        self.MediaId = xmlData.find('MediaId').text
        self.ThumbMediaId = xmlData.find('ThumbMediaId').text
        self.MsgId = xmlData.find('MsgId').text

class ShortVideoMsg(VideoMsg):
    def __init__(self, xmlData):
        VedioMsg.__init__(self, xmlData)
        self.MsgId = xmlData.find('MsgId').text

class LocationMsg(Msg):
    def __init__(self, xmlData):
        Msg.__init__(self, xmlData)
        self.Location_X = xmlData.find('Location_X').text
        self.Location_Y = xmlData.find('Location_Y').text
        self.Scale = xmlData.find('Scale').text
        self.MsgId = xmlData.find('MsgId').text

class LinkMsg(Msg):
    def __init__(self, xmlData):
        Msg.__init__(self, xmlData)
        self.Title = xmlData.find('Title').text
        self.Description = xmlData.find('Description').text
        self.Url = xmlData.find('Url').text
        self.MsgId = xmlData.find('MsgId').text

class EventMsg(Msg):
    def __init__(self, xmlData):
        Msg.__init__(self, xmlData)
        self.Event = xmlData.find('Event').text

class SubscribeEvent(Msg):
    def __init__(self, xmlData):
        Msg.__init__(self, xmlData)
        self.Event = xmlData.find('Event').text
        try:
            self.EventKey = xmlData.find('EventKey').text
            self.Ticket = xmlData.find('Ticket').text
        except:
            pass
        
class ScanEvent(SubscribeEvent):
    def __init__(self, xmlData):
        SubscribeEvent.__init__(self, xmlData)

class LocationEvent(SubscribeEvent):
    def __init__(self, xmlData):
        SubscribeEvent.__init__(self, xmlData)
        self.Latitude = xmlData.find('Latitude').text
        self.Longitude = xmlData.find('Longitude').text
        self.Precision = xmlData.find('Precision').text

class MenuEvent(SubscribeEvent):
    def __init__(self, xmlData):
        SubscribeEvent.__init__(self, xmlData)
        self.EventKey= xmlData.find('EventKey').text
